#include <iostream>
#include <stdexcept>

template <typename T, size_t Capacity = 100>
class MyQueue {
private:
    T data[Capacity];  // 存储队列元素的数组
    size_t front;      // 队头索引
    size_t rear;       // 队尾索引
    size_t count;      // 当前元素数量

public:
    // 构造函数
    MyQueue() : front(0), rear(0), count(0) {}

    // 入队操作
    void enqueue(const T& item) {
        if (isFull()) {
            throw std::overflow_error("队列已满，无法入队");
        }
        data[rear] = item;
        rear = (rear + 1) % Capacity;  // 循环数组
        count++;
    }

    // 出队操作
    T dequeue() {
        if (isEmpty()) {
            throw std::underflow_error("队列为空，无法出队");
        }
        T item = data[front];
        front = (front + 1) % Capacity;  // 循环数组
        count--;
        return item;
    }

    // 获取队首元素（不删除）
    T peek() const {
        if (isEmpty()) {
            throw std::underflow_error("队列为空，无法获取队首元素");
        }
        return data[front];
    }

    // 检查队列是否为空
    bool isEmpty() const {
        return count == 0;
    }

    // 检查队列是否已满
    bool isFull() const {
        return count == Capacity;
    }

    // 获取队列当前元素数量
    size_t size() const {
        return count;
    }

    // 获取队列容量
    size_t capacity() const {
        return Capacity;
    }

    // 清空队列
    void clear() {
        front = rear = count = 0;
    }
};

// 测试代码
int main() {
    MyQueue<int, 5> queue;  // 创建一个容量为5的整型队列

    // 测试入队
    queue.enqueue(10);
    queue.enqueue(20);
    queue.enqueue(30);
    std::cout << "队首元素: " << queue.peek() << std::endl;
    std::cout << "队列大小: " << queue.size() << std::endl;

    // 测试出队
    std::cout << "出队元素: " << queue.dequeue() << std::endl;
    std::cout << "出队后队首元素: " << queue.peek() << std::endl;

    // 测试循环数组特性
    queue.enqueue(40);
    queue.enqueue(50);
    queue.enqueue(60);  // 此时队列已满

    // 测试队列满的情况
    try {
        queue.enqueue(70);
    } catch (const std::overflow_error& e) {
        std::cout << "错误: " << e.what() << std::endl;
    }

    // 测试清空队列
    queue.clear();
    std::cout << "清空后队列大小: " << queue.size() << std::endl;

    return 0;
}